#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <errno.h>



//strstr函数
//在一个字符串中查找另一个字符串
//函数返回字符串str2在str1中 第一次 出现的位置
//字符串的比较匹配不包括\0,以\0作为结束的标志
//函数原型
//char* strstr(const char* str1, const char* str2);


//模拟实现
//模拟实现的话，可能存在多次匹配，所以需要两个指针记录起始地址


//char* my_strstr(const char* str1, const char* str2)
//{
//    const char* s1 = NULL;
//    const char* s2 = NULL;
//    const char* cur = str1;
//
//    if (*str2 == '\0')
//    {
//        return (char*)str1;
//    }
//    
//    while (*cur)
//    {
//        s1 = cur;
//        s2 = str2;
//        
//        while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
//        {
//            s1++;
//            s2++;
//        }
//        if (*s2 == '\0')
//        {
//            return (char*)cur;
//        }
//
//        cur++;
//    }
//    return NULL;
//}
//
//
//int main()
//{
//    char arr1[] = "this is an apple";
//    char arr2[] = "is";
//    char* ret = my_strstr(arr1, arr2);
//
//    if (ret != NULL)
//    {
//        printf("%s\n", ret);
//    }
//    else
//    {
//        printf("找不到");
//    }
//
//
// 	return 0;
//}



//strtok函数
//函数原型
//char* strtok (char* str, const char* sep);
// 1.sep参数指向一个字符串中用作分隔符的字符的集合
// 2.第一个参数指定一个字符串，它包含了0个或者多个由sep字符中一个或者多个分隔符分割的标记
// 3.strtok函数找到str中的下一个标记（分隔符），并把它置换成\0,返回一个指向这个字符串首字母的空指针
// 4.strtok函数会改变被操作的字符，所以被strtok函数切分的字符串一般都是临时拷贝的内容，且是可修改的
//
//int main()
//{
//	char arr1[] = "laideji@1300310481.qqcom";
//	char arr2[50] = { 0 };
//	strcpy(arr2, arr1);
//
//	const char* sep = "@.";
//	char* ret = NULL;                //strotok会保存之前置为\0的地址，所以同一个字符串后面使用就可以直接传NULL                                     
//	for (ret = strtok(arr2, sep); ret != '\0'; ret = strtok(NULL, sep))
//	{
//		printf("%s\n", ret);
//	}
//	return 0;
//}


//strerror函数
//strerror函数可以把参数部分错误码对应的错误信息的字符串的首地址返回来
//错误码包含在errno.h这个头文件中
//c语言程序启动的时候会使用一个全局的变量error来记录当前的错误码
//不过，程序启动的时候errno是0，表示没有错误，如果我们在使用标准库的函数的时候发生了某种错误，
//就会将对应的错误码放在errno中，strerron函数就可以将对应的错误码的对应的错误的字符串的首地址返回


//int main()
//{
//	int i = 0;
//
//	for (i = 0; i <= 10; i++)
//	{
//		printf("%d:        %s\n", i, strerror(i));
//	}
//
//	return 0;
//}

//int main()
//{
//	//fopen以读的形式打开文件的时候，如果文件不存在，就打开失败
//	FILE* pf = fopen("test.txt", "r");//r表示以只读的形式
//	if (pf == NULL)
//	{
//		 //errno这个变量需要包含头文件errno.h
//		printf("%s\n", strerror(errno));
//		
//		return 1;
//	}
//	return 0;
//}
//strerror函数只是将错误码对应的错误信息字符串的首地址返回
//perror函数则是会直接打印,并且会先打印参数部分的字符串，再打印一个冒号和一个空格，再打印错误信息
//perror = printf + strerror


int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("zzr");
	}
	return 0;
}


//0的辨析
//0 -- 数字0
//'0' -- 字符零  对应的ASCII码值是48
//NULL -- 空指针 -- 0
//'\0' -- 字符 -- 对应的ASCII码值是0
//"  " -- 空字符串


